package com.jms.web.mvc.creator;

import com.alibaba.fastjson.JSONObject;
import com.jms.framework.beans.annotation.Component;
import com.jms.web.mvc.annotaion.RequestBody;
import com.jms.web.mvc.utils.RequestUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Parameter;

/**
 * RequestBody参数创建器
 * 用于处理带有@RequestBody注解的参数，将HTTP请求体中的JSON数据转换为对应的Java对象
 */
@Component
public class RequestBodyArgumentCreator extends ArgumentCreator {
    /**
     * 构造函数
     * 初始化参数解析器的优先级为10000
     */
    public RequestBodyArgumentCreator() {
        super(10000);
    }

    /**
     * 创建参数对象
     * 解析HTTP请求体中的JSON数据，并将其转换为指定类型的Java对象
     *
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @param parameter 方法参数对象
     * @return 转换后的Java对象，如果参数没有@RequestBody注解则返回null
     * @throws RuntimeException 当JSON解析或对象转换过程中发生异常时抛出
     */
    @Override
    public Object create(HttpServletRequest request, HttpServletResponse response, Parameter parameter, Object handler) {
        try {
            // 检查参数是否包含@RequestBody注解
            if (parameter.isAnnotationPresent(RequestBody.class)) {
                // 解析请求体中的JSON数据
                JSONObject jsonObject = JSONObject.parseObject(RequestUtils.getRequestBody(request));
                // 将JSON对象转换为参数所需的Java对象类型
                return JSONObject.toJavaObject(jsonObject, parameter.getType());
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return null;
    }
}

